/*
 * PPD.c
 *
 *  Created on: 10/10/2011
 *      Author: utn_so
 */

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <pthread.h>
#include <semaphore.h>
#include <stdint.h>
#include "funcionesDeConsola.h"
#include "algoritmoPPD.h"
#include "Protocolo_NIPC.h"
#include "configLoader.h"
#include "hilos.h"
#include "log.h"

t_direccion_fisica posActualCabezal =
{ 0, 0, 0 };

t_direccion_fisica ultimaPosicion =
{ 0, 0, 0 };

sem_t sem_cola;
sem_t sem_trace;
sem_t sem_sacar;
sem_t fin_trace;

int8_t conexion=-1;
Sector sectorSacado = NULL;
uint8_t DISCO;
tipoConfigPPD configuracion;
t_colaSCAN *colaActual;

char *PATH;
char *archivoConfig;
char *SOCK_PATH;
char *Consola;
char* mapeo;
int8_t archivo;
int cantEscrituras;

t_log* archivoLogueo;

int main(int argc, char **argv)
{
	cola cola_SSTF;
	t_list *Nstep;

	pthread_t tid_insertar;
	pthread_t tid_sacar;
	pthread_t tid_conexion_consola;

	pthread_attr_t attr_conexion_consola;
	pthread_attr_t attr_insertar;
	pthread_attr_t attr_sacar;

	archivoLogueo = log_create("Planificador","./logPPD.txt",8,M_CONSOLE_DISABLE);
	PATH = (char*) malloc(strlen(argv[1]) + 1);
	strcpy(PATH, argv[1]); // pasamos el path del archivo cuando iniciamos el proceso
	SOCK_PATH = (char*) malloc(strlen(argv[2]) + 1);
	strcpy(SOCK_PATH, argv[2]);
	archivoConfig = (char*) malloc(strlen(argv[3]) + 1);
	strcpy(archivoConfig, argv[3]);
	Consola = (char*) malloc(strlen(argv[4]) + 1);
	strcpy(Consola, argv[4]);

	configuracion = leerArchConfigPPD(archivoConfig);
	DISCO = abrirArchivo();

	sem_init(&sem_cola, 0, 1);
	sem_init(&sem_sacar, 0, 0);
	sem_init(&sem_trace, 0, 0);
	sem_init(&fin_trace, 0, 0);

	pthread_attr_init(&attr_insertar);
	pthread_attr_init(&attr_sacar);
	pthread_attr_init(&attr_conexion_consola);

	if (!strcmp(configuracion.algoritmo, "SSTF"))
	{ //Armo cola SSTF
		cola_SSTF = (cola) malloc(sizeof(cola));
		*cola_SSTF = NULL;
		pthread_create(&tid_insertar, &attr_insertar,
				(void*) t_insertar, (void*) cola_SSTF);
		pthread_create(&tid_conexion_consola, &attr_conexion_consola,
				(void*) t_conexion_consola, (void*) cola_SSTF);
		pthread_create(&tid_sacar, &attr_sacar, (void*) t_sacar,
				(void*) cola_SSTF);
	}

	if (!strcmp(configuracion.algoritmo, "NSTEP")){
		colaActual = (t_colaSCAN*) malloc(sizeof(t_colaSCAN));
		colaActual->colaAscendente = NULL;
		colaActual->colaDescendente = NULL;
		colaActual->cantidad=0;
		colaActual->estado=ascendente;
		Nstep=collection_list_create();
		pthread_create(&tid_insertar, &attr_insertar,
						(void*) t_insertar, (void*) Nstep);
				pthread_create(&tid_conexion_consola, &attr_conexion_consola,
						(void*) t_conexion_consola, (void*) Nstep);
				pthread_create(&tid_sacar, &attr_sacar, (void*) t_sacar,
						(void*) Nstep);
	}

	pthread_join(tid_conexion_consola,NULL);
	//pthread_join(tid_insertar,NULL);
	//pthread_join(tid_sacar,NULL);
	pthread_kill(tid_insertar,9);
	pthread_kill(tid_sacar,9);
	return (0);
}

